var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

// 获取，每次前端请求的二级路径要在这里先获取
var adminsRouter = require('./routes/admins');
var logsRouter = require('./routes/logs');
var adminLessorsRouter = require('./routes/adminLessors');
var adminTenantsRouter = require('./routes/adminTenants');
var adminParkingsRouter = require('./routes/adminParkings');
var adminParkingsRouter = require('./routes/adminParkings');
var adminOrdersRouter = require('./routes/adminOrders');
var lessorsRouter = require('./routes/lessors');
var ordersRouter = require('./routes/orders');
var tenantsRouter = require('./routes/tenants');
var parkingsRouter = require('./routes/parkings');
var imagesRouter = require('./routes/images');

// (暂时注释)引入,然后我们要在一级路径之前去做验证
const jwtAuth = require('./utils/jwt');


// 把上面的代码引入我们拆到dao文件里面的database文件，这个文件是链接MongoDB的
require('./dao/database');

var app = express();
require('./dao/database.js');
// 设置其他域名的请求
var allowCrossDomain = function (req, res, next) {
    // 设置允许跨域访问的请求源（* 表示接受任意域名的请求,其他则改为http://IP地址:端口）
    // (注意)：要不就接受任意(*)域名请求，要不就只能设置一个其他域名请求。设置两个没有用
    res.header("Access-Control-Allow-Origin", "*");
    // 设置允许跨域访问的请求头
    res.header("Access-Control-Allow-Headers", "X-Requested-With,Origin,Content-Type,Accept,Authorization");
    // 设置允许跨域访问的请求类型
    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
    // 同意 cookie 发送到服务器（如果要发送cookie，Access-Control-Allow-Origin 不能设置为星号）
    res.header('Access-Control-Allow-Credentials', 'true');
    next();
};
app.use(allowCrossDomain);
// 用require引入，在这个位置执行，后缀是可以省略的
require('./dao/database')
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({
    extended: false
}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use(jwtAuth); // 在一级路径之前，通过app.use使用我们在上面加载的jwt文件暴露的jwtAuth方法
// 前端如果报错401那么就是token没有或者过期了，因为我们在登录的时候设置了token的有效时间
// 那么当请求通过了,没有报401的错,才会开始匹配请求的路径

// 第一个参数用于配置 ajax请求的一级路径

app.use('/adminLessors', adminLessorsRouter);
app.use('/adminTenants', adminTenantsRouter);
app.use('/adminParkings', adminParkingsRouter);
app.use('/adminOrders', adminOrdersRouter);
app.use('/admins', adminsRouter);
app.use('/logs', logsRouter);

app.use('/adminLessors', adminLessorsRouter)

app.use('/lessors', lessorsRouter);
app.use('/orders', ordersRouter);
app.use('/parkings', parkingsRouter);
app.use('/tenants', tenantsRouter);
app.use('/images', imagesRouter);

app.use(async (err, req, res, next) => {
    console.log(err);
    res.status(err.statusCode || 500).send({
        message: err.message
    });
});
// catch 404 and forward to error handler
app.use(function (req, res, next) {
    next(createError(404));
});

// error handler
app.use(function (err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
});



module.exports = app;
// 更改项目的启动命令：node app.js
app.listen(3000, () => {
    console.log('3000端口启动成功')
})